// encoding utf-8
#ifndef __QyRenderItemList__
#define __QyRenderItemList__

#include <QtCore/QList>
#include "QyRenderItem.h"

namespace QyRender {

class ItemGeometry;

/*! \brief ! Список указателей QyRender::Item, с возможностью выборки элементов
	\ingroup RenderCore
*/
class ItemList : public QList<QyRender::Item*> {
public:
	virtual ~ItemList() {}

	QyRender::Item * item( const QUuid & serial ) const; //!< запрсить элемент по серийному номеру
	QyRender::ItemList items( quint32 type ) const; //!< получить все елементы заданного типа
	QyRender::ItemList collision( const QPointF & point ) const; //!< получить все элементы в заданной точки
	QyRender::ItemList collision( const QRectF & rect ) const; //!< получить все элементы входящие в заданную область
	QyRender::ItemList collision( const QyRender::ItemGeometry & geometry ) const; //!< получить все элементы входящие в заданный полигон

};

//! Флаги поиска для QyRender::findItem
enum FindItemFlags {
	FindSingleItem, //!< Завершить поиск при первом совпадении
	FindAllItems    //!< Найти все элементы
};

//! Функция поиска элементов в списке по заданнному параметру используя пользовательскую ф-цию сравнения
template < typename ValueType >
inline QyRender::ItemList findItem( QyRender::ItemList itemList, const ValueType & value,
	bool (*compareFunc)( QyRender::Item * item, const ValueType & value ),
	const FindItemFlags & flags = QyRender::FindSingleItem )
{

	ItemList items;

	foreach ( QyRender::Item * item, itemList ) {

		if ( compareFunc( item, value ) ) {

			items.append(item);

			if ( flags == QyRender::FindSingleItem )
				break;

		}

	}

	return items;
}

};

#endif//__QyRenderItemList__
